package com.ecode.imecode.utils;

import com.alibaba.fastjson.JSONObject;
import com.ecode.imecode.proto.Message;
import com.ecode.imecode.proto.MessageHeader;
import io.netty.buffer.ByteBuf;
import io.netty.util.CharsetUtil;

import java.io.UnsupportedEncodingException;
import java.nio.charset.CharsetDecoder;
import java.util.Objects;

public class MessageDecodeUtils {


    public static Message getMessage(ByteBuf byteBuf) throws UnsupportedEncodingException {
        /* 这个很关键 reset重置之后 就会回到这个位置 重新读取数据 当数据不完整时 保证正确读取数据 */
        byteBuf.markReaderIndex();
        int command = byteBuf.readInt();
        int version = byteBuf.readInt();
        int clientType = byteBuf.readInt();
        int messageType = byteBuf.readInt();
        int appId = byteBuf.readInt();
        int imeiLen = byteBuf.readInt();
        int bodyLen = byteBuf.readInt();
        //如果剩下未读的字节数小于bodyLen 说明数据不完成(出现粘包)
        if(byteBuf.readableBytes()<(imeiLen+bodyLen)){
            //重置已读字节索引
            byteBuf.resetReaderIndex();
            return null;
        }
        byte[] bytes = new byte[imeiLen];
        //读取IMEI值
        byteBuf.readBytes(bytes);
        String imeiV = new String(bytes);
        //数据头
        MessageHeader messageHeader = new MessageHeader();
        messageHeader.setAppId(String.valueOf(appId));
        messageHeader.setCommand(command);
        messageHeader.setVersion(version);
        messageHeader.setClientType(clientType);
        messageHeader.setMessageType(messageType);
        //读取数据体
        byte[] bodyByte = new byte[bodyLen];
        byteBuf.readBytes(bodyByte);
        Message message = new Message();
        message.setImei(imeiV);
        message.setMessageHeader(messageHeader);
        if(messageHeader.getMessageType()==0x0){

            Object jsonObject =  JSONObject.parse(new String(bodyByte, CharsetUtil.UTF_8));
            message.setBodyData(jsonObject);
        }else {
            message.setBodyData(bodyByte);
        }
        //记录当前已读的index
        byteBuf.markReaderIndex();
        return message;
    }
}
